from auth.decorators import login_required
from django.shortcuts import get_object_or_404, render_to_response
from django.http import HttpResponseRedirect, Http404
from django.db import IntegrityError
from django.core.urlresolvers import reverse
from calendario.models import Evento, FormularioEvento
from core.models import Grupo
from datetime import datetime, date, time
from django.forms import ModelChoiceField, CharField
from django.template import RequestContext
import calendar
import datetime

#Vista para ver un evento, requirere login
@login_required
def ver_evento(request,evento_id):
	e = get_object_or_404(Evento, pk=evento_id)
	c = e.creador
	u = request.user
	es_creador = c == u
	return render_to_response('calendario/ver_evento.html', {'evento' : e, 'es_creador' : es_creador}, context_instance=RequestContext(request))

# Vista para editar un evento. Requiere que el usuario este loggeado. Verifica si el usuario es el
# creador del evento. Si no lo es, redirige a la vista del evento.
@login_required
def editar_evento(request, evento_id):
	e = get_object_or_404(Evento, pk=evento_id)
	c = e.creador
	g = request.user.grupos.all()
	
	form = FormularioEvento()
	form.base_fields['nombre'].initial=e.nombre
	form.base_fields['grupo_asociado'] = ModelChoiceField(queryset=g, empty_label=None)
	form.base_fields['grupo_asociado'].initial = e.grupo_asociado
	form.base_fields['descripcion'].initial=e.descripcion
	form.base_fields['lugar'].initial=e.lugar
	form.base_fields['fecha_de_inicio'].initial=e.fecha_de_inicio
	#~ form.base_fields['fecha_de_inicio'].input_formats=['%d/%m/%Y']

	if request.user == c:
		return render_to_response('calendario/editar_evento.html', {'form':form}, context_instance=RequestContext(request))
	else:
		return HttpResponseRedirect(reverse('calendario.views.ver_evento', args=(e.id,)))

# Vista que guarda los cambios hechos a un evento. Verifica que los nuevos valores sean validos. Si lo son,
# guarda los cambios. Si no lo son, redirige a la pagina de edicion y marca los errores.
@login_required
def guardar_edicion( request, evento_id ):
	e = get_object_or_404(Evento, pk=evento_id)
	g = request.user.grupos.all()
	if request.method == 'POST': # If the form has been submitted...
		form = FormularioEvento(request.POST) # A form bound to the POST data
		
		if form.is_valid(): # All validation rules pass
			e = get_object_or_404(Evento, pk=evento_id)
			#~ g = request.user.grupos.all()
			
			n = request.POST['nombre']
			g = g.get(pk=request.POST['grupo_asociado'])
			desc = request.POST['descripcion']
			l = request.POST['lugar']
			f_str = request.POST['fecha_de_inicio']
			#~ d = int(f_str[0:2])
			#~ m = int(f_str[3:5])
			#~ a = int(f_str[6:10])
			a = int(f_str[0:4])
			m = int(f_str[5:7])
			d = int(f_str[8:10])
			fecha = datetime.date(a,m,d)
			
			e.nombre = n
			e.grupo_asociado = g
			e.descripcion = desc
			e.lugar = l
			e.fecha_de_inicio = fecha
			e.save()
			
			return HttpResponseRedirect(reverse('calendario.views.ver_evento', args=(e.id,)))
		else:	# Si el formulario no fue valido, 
			return render_to_response('calendario/editar_evento.html', {'form':form}, context_instance=RequestContext(request))
	else:
		return HttpResponseRedirect(reverse('calendario.views.editar_evento', args=(e.id,)))

# Vista que permite la vista de todos los eventos del dia indicado.
@login_required
def ver_dia( request, dia, mes, anio ):
	try:	# Verifica la fecha de los parametros sea valida.
		fecha = datetime.date( int(anio), int(mes), int(dia) )
		eventos_del_dia = Evento.objects.filter(fecha_de_inicio = fecha)
		eventos = []
		for grupo_usuario in request.user.grupos.all():
			eventos = eventos + list(eventos_del_dia.filter(grupo_asociado=grupo_usuario))
		return render_to_response('calendario/ver_dia.html', {'eventos' : eventos, 'fecha' : fecha }, context_instance=RequestContext(request))
	except ValueError:
		#~ return HttpResponseRedirect(reverse('calendario.views.calendario_principal'))
		raise Http404

# Vista que elimina el evento cuyo id esta incluido en el parametro. Verifica que el metodo sea POST y que
# el que elimina sea el creador del evento.
@login_required
def eliminar_evento( request, evento_id ):
	e = get_object_or_404(Evento, pk=evento_id)
	c = e.creador
	if request.user == c and request.method == 'POST':
		e.delete()
		return HttpResponseRedirect(reverse('calendario.views.menu'))
	else:
		return HttpResponseRedirect(reverse('calendario.views.ver_evento', args=(e.id,)))
	
# Vista para crear un evento, simplemente verifica que el usuario este logeado y muestra el template para crear un evento, envia como parametro los grupos existentes
@login_required
def crear_evento(request):
	#from core.models import Group
	g = Grupo.objects.all()
	f = datetime.datetime.now().date()
	return render_to_response('calendario/crear_evento.html', {'grupos' : g, 'fecha' : f }, context_instance=RequestContext(request))


@login_required
def guardar_evento(request):
	#from core.models import Group
	g = Grupo.objects.all()
	f = datetime.datetime.now()
	if request.method == 'POST':
		nombre_evento=request.POST['nombre']
		grupo_asociado_evento=Grupo.objects.get(nombre=request.POST['combo_grupos'])#.value)
		descripcion_evento=request.POST['descripcion']
		lugar_evento=request.POST['lugar']
		fecha_de_inicio_evento=request.POST['fecha_de_inicio']
		autor_evento=request.user
		try:
			evento=Evento(nombre=nombre_evento,grupo_asociado=grupo_asociado_evento,descripcion=descripcion_evento,lugar=lugar_evento,fecha_de_inicio=fecha_de_inicio_evento,creador=autor_evento)
			evento.save()
		except IntegrityError:
			autor.message_set.create(message='Hubo un error al crear el evento, verifique que sus datos esten correctos.')
			return render_to_response('calendario/crear_evento.html', {'grupos' : g, 'fecha' : f }, context_instance=RequestContext(request))
	return render_to_response('calendario/ver_evento.html', {'evento' : evento, 'autor' : True }, context_instance=RequestContext(request))

@login_required
def calendario_principal(request):
	grupos = request.user.grupos.all()
	eventos = Evento.objects.all()
	hoy = date.today()
	dia = hoy.day
	mes = hoy.month
	anho = hoy.year
	dias_mes = []
	coloreado = []
	calendario = calendar.month(anho,mes)
	lista_calendario = calendario.split('\n')	
	dia_semana_str = ''
	dia_semana_lista = []
	cal = calendar.Calendar()
	it = cal.itermonthdays(anho, mes)
	links = []	

	#Se crea una lista en la que se guardan todos los dias del mes actual
	for dia_mes in it:
		if(dia_mes != 0):
			fecha = date(anho, mes, dia_mes)				
			link = LinkDia(fecha, hay_evento(fecha, grupos))
			links.append(link)
			dias_mes.append(dia_mes)	
	lista_anhos = []
	for x in range(0,6):
		num = anho + x
		lista_anhos.append(num)		
	return render_to_response('calendario/calendario.html',{'calendario' : lista_calendario, 'anho' : anho, 'mes' : mes, 'dias_mes' : dias_mes, 'lista_anhos' : lista_anhos, 'links' : links, 'tamanio' : len(links), 'grupos' : grupos}, context_instance=RequestContext(request))

@login_required
def calendario(request, mes, anho):
	grupos = request.user.grupos.all()
	calendario = calendar.month(anho,mes)
	lista_calendario = calendario.split('\n')
	dias_mes = []
	dias_mes_str = []
	coloreado = []
	dia_semana_str = ''
	cal = calendar.Calendar()
	it = cal.itermonthdays(anho, mes)
	links = []
	for dia in it:
		if(dia != 0):
			fecha = date(anho, mes, dia)
			link = LinkDia(fecha, hay_evento(fecha,grupos))		
			links.append(link)
			dias_mes.append(dia)
	lista_anhos = []
	for x in range(0,6):
		num = anho + x
		lista_anhos.append(x)	
	return render_to_response('calendario/calendario.html',{'calendario' : lista_calendario, 'anho' : anho, 'mes' : mes, 'dias_mes' : dias_mes, 'lista_anhos' : lista_anhos, 'links' : links, 'tamanio' : len(links), 'grupos' : grupos}, context_instance=RequestContext(request))

@login_required
def calendario_filtrado(request):	
	grupos = request.user.grupos.all()
	eventos = Evento.objects.all()
	hoy = date.today()
	dia = hoy.day
	mes = hoy.month
	anho = hoy.year
	dias_mes = []
	coloreado = []
	calendario = calendar.month(anho,mes)
	lista_calendario = calendario.split('\n')	
	dia_semana_str = ''
	dia_semana_lista = []
	cal = calendar.Calendar()
	it = cal.itermonthdays(anho, mes)
	if request.method == 'POST':
		filtro_grupos = request.POST['combo_grupos']		
		grupo_asociado = [filtro_grupos]

	#Se crea una lista en la que se guardan todos los dias del mes actual
	for dia_mes in it:
		if(dia_mes != 0):
			fecha = date(anho, mes, dia_mes)
			link = LinkDia(fecha, hay_evento(fecha, grupo_asociado))
			links.append(link)
			dias_mes.append(dia_mes)
	lista_anhos = []
	for x in range(0,6):
		num = anho + x
		lista_anhos.append(num)	
	
	return render_to_response('calendario/calendario.html',{'calendario' : lista_calendario, 'anho' : anho, 'mes' : mes, 'dias_mes' : dias_mes, 'lista_anhos' : lista_anhos, 'links' : links, 'tamanio' : len(links), 'grupos' : grupos}, context_instance=RequestContext(request))

class LinkDia:
	def __init__(self, fecha, coloreado):
		self.dia_int = fecha.day
		self.dia_str = ""
		if(date.isoweekday(fecha) == 1):
			self.dia_str = 'Lunes'
		elif(date.isoweekday(fecha) == 2):
			self.dia_str = 'Martes'
		elif(date.isoweekday(fecha) == 3):
			self.dia_str = 'Miercoles'
		elif(date.isoweekday(fecha) == 4):
			self.dia_str = 'Jueves'
		elif(date.isoweekday(fecha) == 5):
			self.dia_str = 'Viernes'
		elif(date.isoweekday(fecha) == 6):
			self.dia_str = 'Sabado'
		elif(date.isoweekday(fecha) == 7):
			self.dia_str = 'Domingo'
		self.color = coloreado				

def hay_evento(dia, grupos):
	eventos = Evento.objects.filter(fecha_de_inicio=dia)
	encontrado = False
	for evento in eventos:
		for grupo in grupos:
			if evento.grupo_asociado == grupo:
				encontrado = True
	return encontrado

@login_required
def lista_filtrada(request):
	grupos = None
	all_events = Evento.objects.all()
	grupo_seleccionado = None
	if request.method=='POST':
		grupo_seleccionado = get_object_or_404(Grupo, nombre=str(request.POST['grupo']))
		grupos = [grupo_seleccionado]
	else:
		grupos = request.user.grupos.all()
		grupo_seleccionado = grupos[0]
	print grupo_seleccionado
	eventos = []
	for grupo_usuario in grupos:
		eventos = eventos + list(all_events.filter(grupo_asociado=grupo_usuario))

	return render_to_response('calendario/lista_filtrada.html',{'eventos':eventos, 'grupos':request.user.grupos.all(), 'grupo_seleccionado':grupo_seleccionado}, context_instance=RequestContext(request))

#menu principal
#autor:kmels
@login_required
def menu(request):
	return render_to_response('calendario/menu.html',locals())
